package com.cy.pj.common.web;

import com.cy.pj.common.pojo.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.ShiroException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理类
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler定义统一异常处理对象 {
    @ExceptionHandler(ShiroException.class)
    public JsonResult doShiroException(ShiroException e){
        //***以后不要写:log.error("exception {}",e.getMessage()),
        //因为这样只得到了异常的结果，不能知道具体位置哪里出错了({}也不要加,加不加没作用)
        log.error("exception",e);
        JsonResult result=new JsonResult();
        result.setState(0);
       /** 1.instanceof关键字的作用：判断一个对象是否属于指定的类别。
        2.instanceof关键字的使用前提：判断的对象与指定的类别必须要存在继承或者实现的关系。
        3.instanceof关键字的使用格式：
        if(对象  instanceof 类别){}
        */
        if(e instanceof UnknownAccountException){
            result.setMessage("用户名不存在");
        }else if(e instanceof IncorrectCredentialsException){
            result.setMessage("密码不正确");
        }else if(e instanceof LockedAccountException){
            result.setMessage("账户被锁定");
        }else if(e instanceof AuthorizationException){
            result.setMessage("没有权限");
        }else{
            result.setMessage("认证或授权失败");
        }
        return result;
    }

    @ExceptionHandler(RuntimeException.class)
    public JsonResult doHandleRuntimeException(RuntimeException e){
        log.error("exception {}",e.getMessage());
        e.printStackTrace();
        return new JsonResult(e);
    } }
